namespace ConsoleApp;

public class Tuple
{
    //元组提供一种从方法调用中检索多个值的轻量级方法。 但是，一旦检索到元组，就必须处理它的各个元素。 按元素逐个操作比较麻烦，如下例所示。 QueryCityData 方法返回一个三元组，并通过单独的操作将其每个元素分配给一个变量。
    public static void t1()
    {
        var result = QueryCityData("New York City");

        var city = result.Item1;
        var pop = result.Item2;
        var size = result.Item3;
    }


    public static void t2()
    {
        //可以在括号内显式声明每个字段的类型。 以下示例使用此方法来析构由 QueryCityData 方法返回的三元组。
        (string city, int population, double area) = QueryCityData("New York City");

        //可使用 var 关键字，以便 C# 推断每个变量的类型。 将 var 关键字放在括号外。 以下示例在析构由 QueryCityData 方法返回的三元组时使用类型推理。
        var (city1, population1, area1) = QueryCityData("New York City");

        //还可在括号内将 var 关键字单独与任一或全部变量声明结合使用。
        (string city2, var population2, var area2) = QueryCityData("New York City");
    }


    public static void t3()
    {
        //析构元组时，通常只需要关注某些元素的值。 可以利用 C# 对弃元的支持，弃元是一种仅能写入的变量，且其值将被忽略。 在赋值中，通过下划线字符 (_) 指定弃元。 可弃元任意数量的值，且均由单个弃元 _ 表示
        var (_, _, _, pop1, _, pop2) = QueryCityDataForYears("New York City", 1960, 2010);
    }

    private static (string, int, double) QueryCityData(string name)
    {
        if (name == "New York City")
            return (name, 8175133, 468.48);

        return ("", 0, 0);
    }


    private static (string, double, int, int, int, int) QueryCityDataForYears(string name, int year1, int year2)
    {
        int population1 = 0, population2 = 0;
        double area = 0;

        if (name == "New York City")
        {
            area = 468.48;
            if (year1 == 1960)
            {
                population1 = 7781984;
            }

            if (year2 == 2010)
            {
                population2 = 8175133;
            }

            return (name, area, year1, population1, year2, population2);
        }

        return ("", 0, 0, 0, 0, 0);
    }
}